import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 7, figsize=(15, 8))

#TODO 原图灰度图
img = cv.imread("hanzi1.jpg", 0)
ax[0].imshow(img, cmap='gray')
ax[0].set_title("Original Image")
ax[0].axis('off')

#TODO 全局阈值处理 >> 二值化图
thresh_hold, new_img = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
inverted_img = cv.bitwise_not(new_img)
ax[1].imshow(inverted_img, cmap='gray')
ax[1].set_title("Inverted Image")
ax[1].axis('off')

#TODO 应用腐蚀操作 >> 去除噪点
kernel = np.ones((3, 3), np.uint8)
eroded_img = cv.erode(inverted_img, kernel, iterations=4)
ax[2].imshow(eroded_img, cmap='gray')
ax[2].set_title("Eroded Image")
ax[2].axis('off')

#TODO 应用膨胀操作 >> 突出图像特征 >> 中值滤波去除小白点
dilated_img = cv.dilate(eroded_img, kernel, iterations=3)
median_filtered_img = cv.medianBlur(dilated_img, 5)
ax[3].imshow(median_filtered_img, cmap='gray')
ax[3].set_title("Median Filtered")
ax[3].axis('off')

#TODO 应用闭运算 >> 填充闭合区域
kernel = np.ones((100,100), np.uint8)
closed_img = cv.morphologyEx(median_filtered_img, cv.MORPH_CLOSE, kernel)
ax[4].imshow(closed_img, cmap='gray')
ax[4].set_title("Closed Image")
ax[4].axis('off')

#TODO Canney边缘检测
edges = cv.Canny(closed_img, 50, 150)
ax[5].imshow(edges, cmap='gray')
ax[5].set_title("Canny Edge Detection Canny")
ax[5].axis('off')

#TODO 识别结果
contours, _ = cv.findContours(edges, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
img_copy = img.copy()
for c in contours:
    perimeter = cv.arcLength(c, True)
    x,y,w,h = cv.boundingRect(c)
    cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    if perimeter > 100:
        cv.rectangle(img_copy, (x, y), (x + w, y + h), (0, 255, 0), 2)
ax[6].imshow(img_copy, cmap='gray')
ax[6].set_title("OCR Result")
ax[6].axis('off')

plt.tight_layout()
plt.show()

